﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web.Script.Serialization;


namespace BCZadmin.Helper
{
    public static class JSONHelper
    {
       /// <summary>
       /// 序列化对象
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="t"></param>
       /// <returns></returns>
        public static string ConvertObjToJson<T>(T t)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(t.GetType());
            try
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    ser.WriteObject(ms, t);
                    string strJson = Encoding.UTF8.GetString(ms.ToArray());
                    //替换Json的date字符串
                    string p = @"\\/Date\((\d+)\+\d+\)\\/";
                    MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDataToDateString);

                    Regex reg = new Regex(p);
                    strJson = reg.Replace(strJson, matchEvaluator);
                    return strJson;
                }

            }
            catch (IOException)
            {
                //自己处理异常吧
                return null;
            }


        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="strJson"></param>
        /// <returns></returns>
        public static T JsonDeserialize<T>(string strJson)
            where T :class //BCZadmin.Model.DbModel //约束T为class,此处可改
        {

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));

            try
            {
                //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式

                string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
                MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
                Regex reg = new Regex(p);
                strJson = reg.Replace(strJson, matchEvaluator);

                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))
                {
                    T obj = ser.ReadObject(ms) as T;
                    return obj;
                }
            }
            catch (IOException e)
            {
                return null;
            }

        }
        /// <summary>
        /// Converts the json data to date string.
        /// </summary>
        ///<param name="m">The m.
        /// <returns>System.String.</returns>
        /// <remarks>Editor：v-liuhch CreateTime：2015/6/22 11:39:18</remarks>
        private static string ConvertJsonDataToDateString(Match m)
        {
            string result = string.Empty;
            DateTime dt = new DateTime(1970, 1, 1);
            dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
            dt = dt.ToLocalTime();//转换为本地时间
            result = dt.ToString("yyyy-MM-dd HH:mm:ss");
            return result;

        }
        /// <summary>
        /// Converts the date string to json date.
        /// </summary>
        ///<param name="m">The m.
        /// <returns>System.String.</returns>
        /// <remarks>Editor：v-liuhch CreateTime：2015/6/22 11:39:15</remarks>
        private static string ConvertDateStringToJsonDate(Match m)
        {
            string result = string.Empty;

            DateTime dt = DateTime.Parse(m.Groups[0].Value);

            dt = dt.ToUniversalTime();

            TimeSpan ts = dt - DateTime.Parse("1970-01-01");

            result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);

            return result;
        }
        /// <summary>
        /// 反序列化对象集
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="JsonStr"></param>
        /// <returns></returns>
        public static List<T> JSONStringToList<T>(this string JsonStr)
        {
            JavaScriptSerializer Serializer = new JavaScriptSerializer();
            List<T> objs = Serializer.Deserialize<List<T>>(JsonStr);
            return objs;
        }
    }
}
